高级教程:如何编写可重用的应用
如果你最近没有完成教程1–6,我们建议你阅读它们使得你的示例项目与下面描述的相匹配。
设计、构建、测试和维护一个网页应用有许多工作要做。许多Python 和 Django 项目都有常见的共同问题。如果我们可以节省一些这些重复的工作会不会很棒?
可重用性是Python 中一种生活的态度。Python包索引 (PyPI) 具有广泛的包,你可以在你自己的Python程序中使用。调查一下Django Packages中已经存在的可重用的应用,你可以结合它们到你的项目。Django 自身也只是一个Python 包。这意味着你可以获取已经存在的Python包和Django应用并将它们融合到你自己的网页项目。你只需要编写你项目的独特的部分。
比如说,你正在开始一个新的项目,需要一个像我们正在编写的投票应用。你如何让该应用可重用?幸运的是,你已经在正确的道路上。在教程 3中,我们看到我们可以如何使用include将投票应用从项目级别的URLconf 解耦。在本教程中,我们将更进一步,让你的应用在新的项目中容易地使用并随时可以发布给其它人安装和使用。
你的项目和你的可重用的应用
经过前面的教程之后,我们的项目应该看上去像这样:
你在教程 2中创建了mysite/templates ,在教程 3中创建了polls/templates。 现在你可能更加清晰为什么我们为项目和应用选择单独的模板目录:属于投票应用的部分全部在polls中。它使得该应用自包含且更加容易丢到一个新的项目中。
现在可以拷贝polls目录到一个新的Django项目并立即使用。然后它还不能充分准备好到可以立即发布。由于这点,我们需要打包这个应用来让它对其他人易于安装。
打包你的应用
Python packaging refers to preparing your app in a specific format that can be easily installed and used. Django 自己是以非常相似的方式打包起来的。对于一个像polls这样的小应用,这个过程不是太难。
首先,在你的Django项目之外,为polls创建一个父目录。称这个目录为django-polls。
将polls 目录移动到django-polls目录。
创建一个包含一些内容的文件django-polls/README.rst:
=====
Polls
=====
Polls is a simple Django app to conduct Web-based polls. For each
question, visitors can choose between a fixed number of answers.
Quick start
-----------
1. Add "polls" to your INSTALLED_APPS setting like this::
INSTALLED_APPS = (
...
'polls',
)
2. Include the polls URLconf in your project urls.py like this::
url(r'^polls/', include('polls.urls')),
4. Start the development server and visit http://127.0.0.1:8000/admin/
to create a poll (you'll need the Admin app enabled).
5. Visit http://127.0.0.1:8000/polls/ to participate in the poll.
创建一个django-polls/LICENSE文件。选择License超出本教程的范围,但值得一说的是公开发布的代码如果没有License是毫无用处的。Django和许多与Django兼容的应用以BSD License 发布;然而,你可以随便挑选自己的License。只需要知道你的License的选则将影响谁能够使用你的代码。
下一步我们将创建一个setup.py 文件,它提供如何构建和安装该应用的详细信息。该文件完整的解释超出本教程的范围,setuptools 文档 有很好的解释。创建一个文件django-polls/setup.py,其内容如下:
默认只有Python模块和包会包含进包中。如果需要包含额外的文件,我们需要创建一个MANIFEST.in文件。上一步提到的setuptools 文档对这个文件有更详细的讨论。如果要包含模板、README.rst和我们的LICENSE 文件,创建一个文件django-polls/MANIFEST.in,其内容如下:
django-polls/MANIFEST.in
include LICENSE
include README.rst
recursive-include polls/static *
recursive-include polls/templates *
将详细的文档包含进你的应用中,它是可选的,但建议你这样做。创建一个空的目录django-polls/docs用于将来存放文档。向django-polls/MANIFEST.in添加另外一行:
注意docs不会包含进你的包中除非你添加一些文件到它下面。许多Django应用还通过类似readthedocs.org这样的站点提供它们的在线文档.
更多关于打包的信息,参见Python 的 打包和分发项目的教程。
因为,我们将polls 目录移到项目的目录之外,它不再工作了。我们将通过安装我们的新的django-polls包来修复它。
安装这个包,使用pip(你已经安装好它了,对吧?):
pip install --user django-polls/dist/django-polls-0.1.tar.gz
如果幸运,你的Django 项目现在应该可以再次正确工作。请重新运行服务器以证实这点。
若要卸载这个包,使用pip:
发布你的应用:
既然我们已经打包并测试过django-polls,是时候与世界共享它了!要不是它仅仅是个例子,你现在可以:
- 将这个包用邮件发送给朋友。
- 上传这个包到你的网站上。
- 上传这个包到一个公开的仓库,例如Python 包索引 (PyPI)。packaging.python.org has a good tutorial for doing this.
前面,我们将poll 安装成一个用户的库。它有一些缺点:
- 修改这个用户的库可能影响你的系统上的其它Python 软件。
特别是一旦你维护几个Django项目,这些情况就会出现。如果确实出现,最好的解决办法是使用virtualenv。这个工具允许你维护多个分离的Python环境,每个都具有它自己的库和包的命名空间。